package com.liaoye.hellocustomview.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SurfaceGesturePathView extends SurfaceView {

    private Paint mPaint;
    private Path mPath;
    private static final String TAG = SurfaceGesturePathView.class.getSimpleName();

    public SurfaceGesturePathView(Context context) {
        super(context);
        init();
    }

    public SurfaceGesturePathView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SurfaceGesturePathView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }


    private void init() {
        //这个函数存在于 类中，它主要用在 View 派生子类的初始化中，如果参数 willNotDraw
        //true ，则表示当前控件没有绘制内容，当屏幕重绘的时候，这个控件不需要绘制，所以在
        //重绘的时候也就不会调用这个类的 onDraw（）函数。相反，如果参数 willNotDraw false ，则
        //表示当前控件在每次重绘时，都需要绘制该控件。可见， setWillNotDraw 其实是 种优化策
        //略，它让控件显式地告诉系统，在重绘屏幕时，哪个控件需要重绘，哪个控件不需要重绘，
        //这样就可以大大提高重绘效率。
//        setWillNotDraw(false);
        mPaint =new Paint() ;
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(5);
        mPaint.setColor(Color.RED) ;

        mPath = new Path();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();
        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            mPath.moveTo(x,y);
            return true;
        } else if(event.getAction() == MotionEvent.ACTION_MOVE) {
            mPath.lineTo(x, y);
        }
//        postInvalidate();
        Log.d(TAG, "onTouchEvent: ");
        drawCanvas();
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(mPath, mPaint);
        Log.i(TAG, "onDraw: ");
    }

    private void drawCanvas() {
        new Thread(() -> {
            SurfaceHolder holder = getHolder();

            //通过 urfaceHolder.lockCanvas （）函数得到 urfaceView 中自带的缓冲画布，防止被其他线程更改
            Canvas canvas = holder.lockCanvas();
            canvas.drawPath(mPath, mPaint);
            //数将缓冲画布释放，并将所画内容更新到主线程的画布上
            holder.unlockCanvasAndPost(canvas);
        }).start();
    }
}
